Bellman-Ford算法

一、算法概述

  • Bellman-Ford算法,也可以翻译成中文“贝尔曼-福特算法”,常常拿来和Dijkstra算法一起比较理解。
  • Bellman-Ford算法的原理是对图进行 V-1 次松弛操作,算法的复杂度高达O(VE)。但是相对于Dijkstra算法,尽管算法复杂度稍高一些,但是它能处理带负权值边而没有负权回路的图。V-1次松弛操作,必定能求出最短路径,因为图的深度最多为V-1.

二、实现步骤

  • 数组 distance[v] 表示从源点source到顶点v的最短路径,即为要求的答案。
  • 数组 predecessor[v] 表示从源点source到顶点v的最短路径p(s,....,v),顶点v的前一个节点。可以由此数组导出一个前驱子图或以source为根的最短路径树。
  • w表示边 (u,v) 的权值。
  1. 初始化操作:一开始从source到自己的距离为0,到其他所有点的最短距离为正无穷大。
  2. 进行 V-1 次松弛操作:每一次对所有的边遍历一遍,若distance[u] + w < distance[v],则更新distance[v]和predecessor[v]。
  3. 检查是否存在负权回路:对每条边遍历一遍,若仍然可以更新distance,说明存在负权回路。

三、伪代码实现

摘自维基百科的贝尔曼

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值